home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / pasprog.EXE / OLINK.PAS < prev    next >
Pascal/Delphi Source File  |  1995-04-22  |  4KB  |  149 lines

  1. unit olink;
  2.  
  3. interface
  4.  
  5. type
  6.   pLink = ^aLink;
  7.   aLink = object
  8.           prnt : pLink;
  9.           prev : pLink;
  10.           next : pLink;
  11.           head : pLink;
  12.           tail : pLink;
  13.           constructor create;
  14.           destructor destroy;virtual;
  15.           function Add(link:pLink):boolean;
  16.           function Del(link:pLink):boolean;
  17.           function Ins(link:pLink;after:pLink):boolean;
  18.           function MakeTop(child:pLink):boolean;
  19.           function MakeBot(child:pLink):boolean;
  20.           end;
  21.  
  22. function GetGlobalNext(link:pLink):pLink;
  23. function GetGlobalPrev(link:pLink):pLink;
  24.  
  25. implementation
  26.  
  27. constructor aLink.create;
  28. begin
  29.   prnt:=nil; prev:=nil; next:=nil; head:=nil; tail:=nil;
  30. end;
  31.  
  32. function aLink.Add(link:pLink):boolean;
  33. begin
  34.   Add:=false;
  35.   if ( (link=nil) or (link^.prnt<>nil) ) then exit;
  36.   if (head=nil)
  37.     then begin head:=link; link^.prev:=nil; end
  38.     else begin tail^.next:=link; link^.prev:=tail; end;
  39.   link^.next:=nil;
  40.   link^.prnt:=@self;
  41.   tail:=link;
  42.   Add:=true;
  43. end;
  44.  
  45. function aLink.Del(link:pLink):boolean;
  46. var
  47.   search : plink;
  48. begin
  49.   Del:=false;
  50.   search:=head;
  51.   while ( (search<>link) and (search<>nil) ) do search:=search^.next;
  52.   if (search=nil) then exit;
  53.   if(link^.next<>nil)
  54.     then link^.next^.prev:=link^.prev
  55.     else tail:=link^.prev;
  56.   if(link^.prev<>nil)
  57.     then link^.prev^.next:=link^.next
  58.     else head:=link^.next;
  59.   link^.next:=nil;
  60.   link^.prev:=nil;
  61.   link^.prnt:=nil;
  62.   Del:=true;
  63. end;
  64.  
  65. function aLink.Ins(link:pLink;after:pLink):boolean;
  66. var
  67.   search : plink;
  68. begin
  69.   Ins:=false;
  70.   if ( (link=nil) or (link^.prnt<>nil)) then exit;
  71.   if (after=nil)
  72.     then begin
  73.          if (head=nil) then begin
  74.                            tail:=link;
  75.                            end
  76.                       else begin
  77.                            head^.prev:=link;
  78.                            end;
  79.          link^.next:=head;
  80.          head:=link;
  81.          end
  82.     else begin
  83.          search:=head;
  84.          while ( (search<>after) and (search<>nil) ) do search:=search^.next;
  85.          if (search=nil) then exit;
  86.          if (after^.next=nil) then tail:=link
  87.                               else after^.next^.prev:=link;
  88.          link^.next:=after^.next;
  89.          after^.next:=link;
  90.     end;
  91.   link^.prnt:=@self;
  92.   link^.prev:=after;
  93.   Ins:=true;
  94. end;
  95.  
  96. function GetGlobalNext(link:pLink):pLink;
  97. var
  98.   search : plink;
  99. begin
  100.   if link^.head<>nil
  101.     then GetGlobalNext:=link^.head
  102.     else if link^.next<>nil
  103.            then GetGlobalNext:=link^.next
  104.            else begin
  105.                 search:=link^.prnt;
  106.                 while (search<>nil) and (search^.next=nil)
  107.                   do search:=search^.prnt;
  108.                 if search=nil
  109.                   then GetGlobalNext:=nil
  110.                   else GetGlobalNext:=search^.next;
  111.                 end;
  112. end;
  113.  
  114. function GetGlobalPrev(link:pLink):pLink;
  115. var
  116.   search : plink;
  117. begin
  118.   if link^.prev=nil
  119.     then GetGlobalPrev:=link^.prnt
  120.     else if link^.prev^.tail=nil
  121.             then GetGlobalPrev:=link^.prev
  122.             else begin
  123.                  search:=link^.prev^.tail;
  124.                  while search^.tail<>nil do search:=search^.tail;
  125.                  GetGlobalPrev:=search;
  126.                  end;
  127. end;
  128.  
  129. function aLink.MakeTop(child:pLink):boolean;
  130. begin
  131.   MakeTop:=false;
  132.   if Del(child)<>true then exit;
  133.   if Add(child)<>true then exit;
  134.   MakeTop:=true;
  135. end;
  136.  
  137. function aLink.MakeBot(child:pLink):boolean;
  138. begin
  139.   MakeBot:=false;
  140.   if Del(child)<>true then exit;
  141.   if Ins(nil,child)<>true then exit;
  142.   MakeBot:=true;
  143. end;
  144.  
  145. destructor aLink.Destroy;
  146. begin
  147. end;
  148.  
  149. end.